﻿// ===============================================================================
//  Copyright © NewSQL.CN. All rights reserved .
//  技术论坛：http://newsql.cn/
//  个人博客：http://www.ymind.net/
//  版权所有：NewSQL中文社区 彦铭工作室
// ===============================================================================

using System.Text;

namespace Newsql.Data.RDBMS
{
	/// <summary>
	/// 为关系型数据库的数据访问提供基类。
	/// </summary>
	public abstract class RDBMSDALBase : DatabaseDALBase
	{
		/// <summary>
		/// 初始化 <see cref="RDBMSDALBase"/> 对象。
		/// </summary>
		/// <param name="dbTypeId">数据库类型。</param>
		/// <param name="masterGroup">主机连接字符串的分组名称。</param>
		protected RDBMSDALBase(string dbTypeId, string masterGroup) : base(dbTypeId, masterGroup) { }

		/// <summary>
		/// 初始化 <see cref="RDBMSDALBase"/> 对象。
		/// </summary>
		/// <param name="dbTypeId">数据库类型。</param>
		/// <param name="masterGroup">主机连接字符串的分组名称。</param>
		/// <param name="slaveGroup">从机连接字符串的分组名称。</param>
		protected RDBMSDALBase(string dbTypeId, string masterGroup, string slaveGroup) : base(dbTypeId, masterGroup, slaveGroup) { }

		/// <summary>
		/// 获取或设置数据库查询提供程序。
		/// </summary>
		public abstract string SqlProvider { get; }

		/// <summary>
		/// 通过指定存储过程名称获取查询构造器。
		/// </summary>
		/// <param name="procName">指定要查询的存储过程名称。</param>
		/// <returns>返回 <see cref="QueryBuilder{T}"/> 的实例。</returns>
		public QueryBuilder<StoredProcedure> StoredProcedure(string procName) { return SimpleSql.StoredProcedure(procName, this.SlaveConnectionStrings, this.SqlProvider); }

		/// <summary>
		/// 通过指定存储过程名称获取查询构造器。
		/// </summary>
		/// <param name="procName">指定要查询的存储过程名称。</param>
		/// <returns>返回 <see cref="QueryBuilder{T}"/> 的实例。</returns>
		public QueryBuilder<StoredProcedure> StoredProcedureOnMaster(string procName) { return SimpleSql.StoredProcedure(procName, this.MasterConnectionStrings, this.SqlProvider); }

		/// <summary>
		/// 通过指定 Sql 查询语句获取查询构造器。
		/// </summary>
		/// <param name="sqlStatementBuilder">指定包含 Sql 查询语句的字符串。</param>
		/// <returns>返回 <see cref="QueryBuilder&lt;Query&gt;"/> 的实例。</returns>
		public QueryBuilder<Query> Query(StringBuilder sqlStatementBuilder) { return this.Query(sqlStatementBuilder.ToString()); }

		/// <summary>
		/// 通过指定 Sql 查询语句获取查询构造器。
		/// </summary>
		/// <param name="sqlStatement">指定包含 Sql 查询语句的字符串。</param>
		/// <returns>返回 <see cref="QueryBuilder&lt;Query&gt;"/> 的实例。</returns>
		public QueryBuilder<Query> Query(string sqlStatement) { return SimpleSql.Query(sqlStatement, this.SlaveConnectionStrings, this.SqlProvider); }

		/// <summary>
		/// 通过指定 Sql 查询语句获取查询构造器。
		/// </summary>
		/// <param name="sqlStatementBuilder">指定包含 Sql 查询语句的字符串。</param>
		/// <returns>返回 <see cref="QueryBuilder&lt;Query&gt;"/> 的实例。</returns>
		public QueryBuilder<Query> QueryOnMaster(StringBuilder sqlStatementBuilder) { return this.QueryOnMaster(sqlStatementBuilder.ToString()); }

		/// <summary>
		/// 通过指定 Sql 查询语句获取查询构造器。
		/// </summary>
		/// <param name="sqlStatement">指定包含 Sql 查询语句的字符串。</param>
		/// <returns>返回 <see cref="QueryBuilder&lt;Query&gt;"/> 的实例。</returns>
		public QueryBuilder<Query> QueryOnMaster(string sqlStatement) { return SimpleSql.Query(sqlStatement, this.MasterConnectionStrings, this.SqlProvider); }

		/// <summary>
		/// 为多个查询创建简单的事务。
		/// </summary>
		/// <returns>返回 <see cref="SimpleTransaction"/> 的实例。</returns>
		public SimpleTransaction CreateTransaction() { return SimpleSql.CreateTransaction(this.SlaveConnectionStrings, this.SqlProvider); }

		/// <summary>
		/// 为多个查询创建简单的事务。
		/// </summary>
		/// <returns>返回 <see cref="SimpleTransaction"/> 的实例。</returns>
		public SimpleTransaction CreateTransactionOnMaster() { return SimpleSql.CreateTransaction(this.MasterConnectionStrings, this.SqlProvider); }
	}
}
